LINQ to OpenAccessContext
這篇又是 OpenAccess 快速入門的番外篇了,要和大家聊聊 LINQ to OpenAccessContext。
不知道大家會不會有這個疑問:為什麼我們可以在 Telerik OpenAccess 所建立的模型上,應用微軟定義的 LINQ 語法?而且還可以轉化為不同資料庫的 SQL 語法,進而搜尋、取回資料庫中的資料表內容?
其實 LINQ 本身只是存取『資料物件集合』的語法,和資料來源的種類無關,只要想應用 LINQ 的物件集合(或稱為物件容器),實做了 LINQ IQueryable Provider 所規定的內容,就可以使用 LINQ 語法存取各種資料結構、Web 服務或資料庫等等,像微軟官方所提供的 LINQ to Entities 就是給 Entity Framework 用的,LINQ to SQL 則是讓我們可以透過 LINQ 直接存取 MS SQL 資料庫。換言之,LINQ to OpenAccessContext 就是讓我們可以應用 LINQ 語法存取 OpenAccessContext 中的物件實體(Entity)。
※ 關於實做 LINQ IQueryable Provider 的內容,已超出本系列範圍,有興趣的人可以參閱 MSDN 相關文章:啟用資料來源以進行 LINQ 查詢。
這裡是要告訴大家,其實 Telerik OpenAccess 是透過 IQToolkit 實做 LINQ IQueryable Provider,並把 LINQ 語法轉成對應不同資料庫的 SQL Script。而 IQToolkit 則是一套開源組件,非微軟官方的 LINQ 框架幾乎都是參考它的架構、程式碼,甚至直接引用,有興趣了解的朋友,可參閱以下文章:
LINQ: Building an IQueryable provider series
Entity Framework初探
所以,一開始問題的答案:在 OpenAccess ORM 中,因為有實作 LINQ IQueryable Provider,所以我們才可以使用 LINQ 搜尋、取回 OpenAccessContext 中的物件,而且會透過 IQToolkit 將 LINQ 語法轉換成資料庫的 SQL Script。
額外一提:OpenAccessContext 在那裡
OpenAccessContext 是應用 OpenAccess 的起點,也是整個 OpenAccess ORM 的核心,不管是新刪修查資料,都要透過它。但是第一次接觸時,我有一個很大的疑惑:
OpenAccessContext 是整個 ORM 的核心類別,但為什麼,它放在 Telerik.OpenAccess.35.Extensions.dll 組件中,而不是 Telerik.OpenAccess.dll 中?
事實上,Telerik.OpenAccess.dll 組件的確是核心類別,幾乎大部份的操作都在這裡,但是因為 .Net Framework 版本不同,可能會有一些不一樣的底層操作,所以 OpenAccess 把 OpenAccessContext 放到 Extensions 組件中,另外抽取了父系類別 OpenAccessContextBase,把大部分共用的方法寫在這裡,而 OpenAccessContextBase 類別就放在 Telerik.OpenAccess.dll 中。
底層的事說完了,下一篇我們再回到程式吧。